const CryptoJS=require('crypto-js');

/**
 * 生成阿里云 OSS 带签名的图片 URL
 * @param {Object} params - 入参对象
 * @param {string} params.bucket - OSS 存储桶名称（如：taolele-wch）
 * @param {string} params.endpoint - OSS 地域节点（如：oss-cn-hangzhou.aliyuncs.com）
 * @param {string} params.objectKey - OSS 中文件的完整路径（如：504bb1f4d2a24be7b0466908bd8ba2ef.jpg）
 * @param {string} params.accessKeyId - STS 临时凭证的 access_key_id
 * @param {string} params.accessKeySecret - STS 临时凭证的 access_key_secret
 * @param {string} params.securityToken - STS 临时凭证的 security_token
 * @param {number} [params.expires=3600] - URL 有效期（秒，默认 1 小时，需 ≤ STS 凭证有效期）
 * @returns {string} 带签名的 OSS 图片 URL
 */
function getOssSignedUrl(params) {
  // 1. 解构参数并设置默认值
  const {
    bucket,
    endpoint,
    objectKey,
    accessKeyId,
    accessKeySecret,
    securityToken,
    expires = 3600 // 默认有效期 1 小时
  } = params;

  // 2. 验证必传参数
  if (!bucket || !endpoint || !objectKey || !accessKeyId || !accessKeySecret || !securityToken) {
    throw new Error('OSS 签名参数不完整，请检查 bucket、endpoint、objectKey、accessKeyId、accessKeySecret、securityToken');
  }

  // 3. 构建基础 URL 和待签名字符串
  const baseUrl = `https://${bucket}.${endpoint}/${encodeURIComponent(objectKey)}`; // 对文件路径编码（避免特殊字符问题）
  const expirationTime = Math.floor(Date.now() / 1000) + expires; // 签名过期时间（Unix 时间戳，秒）
  
  // 待签名字符串格式：GET\n\n\n<expires>\n/<bucket>/<objectKey>
  // （\n 为换行符，Content-Type、Content-MD5 为空时留空）
  const stringToSign = `GET\n\n\n${expirationTime}\n/${bucket}/${objectKey}`;

  // 4. HMAC-SHA1 加密生成签名（需转 Base64 并 URL 编码）
  const hmac = CryptoJS.HmacSHA1(stringToSign, accessKeySecret);
  const signature = encodeURIComponent(CryptoJS.enc.Base64.stringify(hmac));

  // 5. 拼接所有参数，生成最终带签名的 URL
  const signedUrl = `${baseUrl}?` +
    `AccessKeyId=${encodeURIComponent(accessKeyId)}&` +
    `Expires=${expirationTime}&` +
    `Signature=${signature}&` +
    `SecurityToken=${encodeURIComponent(securityToken)}`;

  return signedUrl;
}

// 导出函数（支持 UniApp 全局调用）
export default {
  getOssSignedUrl
};